Forum des exercices du projet Zuul

Exercice 7.26

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.26
par anonfirstname2 anonlastname2, jeudi 11 avril 2019, 09:19
 

Implement the back command so that using it repeatedly takes you back several rooms, all the way to the beginning of the game if used often enough. Use a Stack to do this. (You may need to find out about stacks. Look at the Java library documentation.)

La commande back fonctionne-t-elle si l'on est revenu au point de départ du jeu ?  Modifier son jeu s'il n'a pas le comportement désiré.

Aide :
Pour faire cet exercice à partir d'un programme qui fonctionnait parfaitement au 7.23, il suffit de modifier toute instruction ajoutée au 7.23 qui utilisait une simple variable aPreviousRoom par une instruction qui utilise une pile aPreviousRooms (sous réserve qu'elle ait été correctement créée, bien sûr).

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 22 mars 2015, 17:19
 

Un étudiant a écrit :

Bonjour, 

Je suis en train de travailler à ma commande back, malheureusement j'ai une erreur à l'exécution que je ne parvient pas à faire disparaître. Le problème est du à une NullPointerExeption comme le message précédent, mais je ne comprend pas pourquoi. Voici le code de la méthode goRoom() récalcitrante :

/**
 * Try to go to one direction. If there is an exit, enter the new
 * room, otherwise print an error message.
 */
private void goRoom(Command command)
{
  [code supprimé pour ne pas influencer les futurs lecteurs]
}

Merci de m'éclairer !

Cordialement

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 27 avril 2014, 16:41
 

1) La première hypothèse pour une NullPointerException survenant sur une ligne contenant roomHistory.push(... est que la variable roomHistory n'a pas été initialisée et vaut donc null.

2) Je trouve plusieurs points bizarres dans votre méthode, aussi je vous les signale :

  • la co-existence de previousRoom (réminiscence de la première version de back où on ne pouvait mémoriser qu'une seule pièce) et de roomHistory (nouveauté de la deuxième version de back utilisant une pile pour mémoriser plusieurs pièces)
  • la présence de la conversion (Room) alors que la pile devrait avoir été déclarée et créée en indiquant que c'est une pile de pièces (donc aucune conversion n'est nécessaire)
  • l'utilisation de la valeur retournée par push alors que cette méthode ne devrait vous servir qu'à empiler une pièce
Avatar William AFONSO
Re: Exercice 7.26
par William AFONSO, dimanche 22 mars 2015, 17:21
 

Bonjour,

ma commande back marche pour une salle, puis, elle me fait rester à la même salle à chaque appel. Pouvez-vous m'aider? voici mon code:

Dans ma classe gameEngine:

private void goRoom(Command pCommand)
    {
        [code supprimé pour ne pas influencer les futurs lecteurs]
    }

private void back(Command command)
{

    [code supprimé pour ne pas influencer les futurs lecteurs]
        }

private void enterRoom(final Room pNextRoom) {
       [code supprimé pour ne pas influencer les futurs lecteurs]
    }

Merci

Avatar Jonathan MORELL
Re: Exercice 7.26
par Jonathan MORELL, dimanche 4 mai 2014, 22:59
 

Je n'ai pas lu tout ton code mais je peux te dire que tu as utilisé la méthode peek() pour ta Stack au lieu d'un pop().

Le peek() récupère la dernière salle de la pile mais ne l'enlève pas tandis
que pop() récupère la dernière salle de la pile mais l'enlève.

Je pense que vient de là ton problème.

(Modifié par Denis BUREAU. Écrit initialement le dimanche 4 mai 2014, 18:27)

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 4 mai 2014, 23:02
 

Un étudiant a écrit :

Bonsoir,

Je rencontre un problème avec la méthode back() car je vois très bien comment la mettre en oeuvre en retournant au nord si on avait tapé "go south" etc.. mais je ne vois pas comment  enregistrer les salles.

Notre jeu est une sorte de labyrinthe ou les portes vont rarement dans les deux sens, du coup je ne sais pas si on doit laisser la méthode classique consistant à inverser la direction (en sachant qu'il peut y avoir la réponse "il n'y a pas d'issue" ou la possibilité d'envoyer dans une pièce qui n'est pas celle d'où l'on vient type pas la même porte mais dans la même direction) ou si nous devons trouver un autre moyen pour vraiment mettre en pratique le retour dans un salle précise ?

Cordialement

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 4 mai 2014, 23:05
 

Le principe de la commande back n'est pas d'aller dans la direction inverse de la précédente, mais d'aller dans la pièce d'où on vient. La suite des pièces que l'on a traversées est stockée dans une pile ; il suffit donc à chaque commande back de dépiler une pièce et d'y aller !

Avatar Chelsy Anne KASSAVALOO
Re: Exercice 7.26
par Chelsy Anne KASSAVALOO, jeudi 9 octobre 2014, 19:53
 

Bonsoir.

Ma commande back fonctionne bien en utilisant Stack mais quand je compile le message d'erreur suivant s'affiche.

Warnings from last compilation

Note : ../La_Maison_Hantee/GameEngine.java uses unchecked or unsafe operations.

Note : Recompile with -Xlint:unchecked for details.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, vendredi 10 octobre 2014, 09:40
 

La réponse à votre question va servir à beaucoup d'autres ...

Le compilateur vous dit que vous utilisez des opérations non sûres (car non vérifiées). Il ne refuse pas de compiler car votre programme peut fonctionner, mais il vous avertit qu'il n'en garantit pas le bon fonctionnement.

Ce qu'il ne peut pas vérifier ici est le type des objets que vous mettez dans votre Stack (et donc, le type des objets qu'on peut en ressortir !).

Pour corriger cela, il suffit de vérifier que vous avez bien précisé le type des objets contenus dans la Stack entre < et >, à la fois à la déclaration et à la création de l'objet Stack.

Ce genre de problème peut vous arriver pour toute collection de données, telle que Stack, ArrayList, HashMap, ...

Avatar Chelsy Anne KASSAVALOO
Re: Exercice 7.26
par Chelsy Anne KASSAVALOO, vendredi 10 octobre 2014, 22:38
 

Merci maintenant que j'ai précisé le type ça fonctionne.

Avatar Yi Heng CAO
Re: Exercice 7.26
par Yi Heng CAO, samedi 21 mars 2015, 18:04
 

Bonjour,

Ma méthode back fonctionne dans les cas généraux d'utilisation.
Mais pas pour un cas particulier, celui du chemin a sens unique.

En effet, (pour illustrer mon problème) il y a une salle A et B, on ne peut qu'aller de la A à la B, ce qui veut dire qu'on ne peut logiquement pas faire demi-tour. Pourtant avec la commande back, on y parvient !

J'ai pensé à créer une condition pour vérifier si justement on peut ou non faire demi-tour, puis d'utiliser la méthode clear sur la Stack pour la remettre à zéro si on était dans le cas où l'on ne peut pas faire demi-tour.
Mais je ne vois pas comment exprimer cette condition ( mis à part le fait de trouver un moyen d'exprimer la direction opposée et de vérifier dans la nouvelle Room s'il y a une sortie ou non dans cette direction.)

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, samedi 9 novembre 2019, 18:06
 
En fait, vous avez créé une Trap Door, ce qui n'est normalement demandé qu'à l'exercice 7.43.
Donc :
- soit vous laissez ça en l'état en attendant d'arriver à l'exercice 7.43 (tant pis, d'ici là, on pourra revenir en arrière malgré la Trap Door)
- soit vous faites tout de suite l'exercice 7.43 et revenez au 7.26 après.

Avatar Yi Heng CAO
Re: Exercice 7.26
par Yi Heng CAO, dimanche 22 mars 2015, 19:01
 

J'ai compris ce qu'il fallait faire, mais je n'arrive pas à l'appliquer...
En effet, dans la méthode goRoom, pour savoir s'il y avait une sortie dans la direction citée, nous utilisions getSecondWord pour récupérer la direction tapée, et ensuite vérifier s'il y avait bien une Room en sortie.

       String vDirection = pCommandWord.getSecondWord();
       Room vNextRoom = this.aCurrentRoom.getExit(vDirection);

       if (vNextRoom == null) //Aucune porte
           this.aGUI.println ("Il n'y a pas de chemin !");

Mais pour la méthode back, il n'y a que le premier mot, on ne peut donc pas utiliser cette manière de faire pour savoir s'il y a une sortie.

J'aurai tendance à écrire this.aCurrentRoom(...) == null pour voir s'il y a une sortie disponible. (Mais je ne vois pas ce que je pourrais écrire dans la parenthèse étant donnée qu'on ne peut pas utiliser ce qui est cité au dessus.)


Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 22 mars 2015, 21:09
 

Non ; pour "vérifier s'il existe bien dans B une sortie allant vers A", il faut parcourir toutes les sorties de B et vérifier si l'une d'elles mène à A.

Avatar Mathieu CARANGEOT
Re: Exercice 7.26
par Mathieu CARANGEOT, mercredi 15 avril 2015, 16:17
 

Est ce que la démarche suivante est correcte?

1) importer la classe nécessaire : import java.util.Stack;

2) A chaque changement de pièce ajouter la pièce précédente dans Stack (à l'aide de push)

3) Lorsque que l'on exécute la commande back, il s'agit de mettre la dernière pièce du tableau en pièce courante et de supprimer celle ci du tableau (à l'aide de pop() )

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mercredi 15 avril 2015, 17:10
 

oui (sauf que ce n'est pas un tableau, mais une pile)

Avatar Andre DESNOYERS
Re: Exercice 7.26 STACK
par Andre DESNOYERS, mercredi 15 avril 2015, 17:20
 

L'image de la PILE de jetons devrait vous conforter :

Si vous empirez un jeton bleu, puis un jeton jaune, puis deux jetons rouges et un jeton vert dans quel ordre les retirez vous de la pile (l'extrction pr le bas est interdite car la pile s'écroulerait).

Avatar Lucas SOENEN
Re: Exercice 7.26
par Lucas SOENEN, mercredi 20 mai 2015, 16:18
 

Bonjour .

Lorsque je passe 2 Salle et que je veux revenir à la première salle je dois effectuer 3 retour :

- Nous sommes dans A

- Aller B

- Aller C

- le premier retour : C a B

- 2e retour : rien

- 3e retour : B a A

Pourquoi le 2ème retour ne me renvois pas directement a A.

De plus, quand je ne passe qu'une salle, le retour arrive directement en une fois à aller de B a A.

Merci.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mercredi 20 mai 2015, 17:06
 

La réponse à la question que vous avez posée est :
parce-que vous avez fait une erreur de programmation dans la commande back et/ou la commande go.

Si cela ne vous suffit pas pour résoudre votre problème, il faudrait m'envoyer le code de ces deux commandes
(et éventuellement me dire quel affichage se produit lors du 2ème retour).

Avatar Lucas SOENEN
Re: Exercice 7.26
par Lucas SOENEN, jeudi 7 avril 2016, 17:23
 

commande go :

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...


Commande Back :

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...


Lors du deuxieme retour, la console me dit que je suis a nouveau dans la salle B comme lors du premier retour.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mercredi 20 mai 2015, 19:15
 

Dans goRoom() :

supprimer les deux lignes redondantes
       this.aStack.push(this.currentRoom);
et       
       currentRoom = vNextRoom;
avant
       if (vNextRoom == null)

Dans GameEngine :

supprimer aBackRoom qui n'a plus lieu d'être avec la Stack.

Remarque : il faut le mettre this partout où c'est possible (pourquoi parfois currentRoom et parfois this.currentRoom, qui devrait d'ailleurs s'appeler aCurrentRoom ?)

Avatar Thomas EUVRARD
Re: Exercice 7.26
par Thomas EUVRARD, jeudi 7 avril 2016, 17:24
 

Bonjour monsieur,

J'ai une erreur de compilation pour l'utilisation de la class Stack :

private Stack aBackRoom;

'incompatible types: java.lang;Object cannot bo converted to Room'

concernant la ligne :

 this.aCurrentRoom = this.aBackRoom.pop(); 

de la procédure back()

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...


Pourtant la pile ne comprendra que des Room. Voici les seuls endroit où est utilisé le stack aBackRoom

dans CreateRooms() :          this.aBackRoom = new Stack();

dans goRoom(final Command pDirection) :    this.aBackRoom.push(this.aCurrentRoom);

Merci pour votre aide.

Avatar Vincent MONARD
Re: Exercice 7.26
par Vincent MONARD, mercredi 28 octobre 2015, 15:09
 

C'est parce que tu ne dis nulle part que la pile ne comprendra que des Room. Quand tu créées un Stack il faut préciser quel type d'objet il contiendra (par défaut Java considère que tu vas mettre des Object dedans).
Donc ta ligne private Stack aBackRoom; doit contenir une information en plus (un peu comme quand tu crées une Hashmap tu vois ?)

Avatar Thomas EUVRARD
Re: Exercice 7.26
par Thomas EUVRARD, mercredi 28 octobre 2015, 15:50
 

Merci pour ton aide,

en effet en remplaçant :

private Stack aBackRoom;

par :

private Stacl<Room> aBackRoom;

ça marche très bien !

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, jeudi 7 avril 2016, 17:25
 

Un étudiant a écrit :

j'ai de nouveau besoin de votre aide, j'ai revu mon jeu en ajoutant un bon plan avec des nouvelles salles, de nouveaux boutons ... et depuis, mon back m'affiche un NullPointerException quand je fais appelle a back quand je suis à ma première salle, en gros je lance le jeu, j’exécute directement back et j'ai un NullPointerException que je ne comprend pas et des camarades n'ont pas cet erreur, mon back marchait aussi correctement avant ces modifications.

Pouvez vous m'aidez à résoudre mon problème.


Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, jeudi 7 avril 2016, 17:32
 

Je ne peux pas vous aider précisément puisque vous ne me donnez pas la ligne de code qui provoque l'exception.

Toutefois, "résoudre" une NullPointerException est toujours un peu la même chose :

- la ligne doit ressembler à objet.méthode()
- objet vaut donc null
- chercher l'instruction qui aurait dû rendre objet non null
- ne pas la trouver, ou bien voir qu'elle s'exécute après la ligne qui provoque l'exception
- l'ajouter, ou bien la déplacer pour qu'elle s'exécute avant

D'une façon générale, vous pouvez aussi consulter l'atelier de débogage.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, samedi 9 avril 2016, 22:35
 

Un étudiant a écrit :

je suis bloqué à cette exercice car j'ai lu la javadoc de Stack et je pense l'avoir compris cependant après avoir modifié back () j'ai l'erreur suivante :
incompatible types : Room cannot be converted to java.util.Stack <Room>
Je comprends ce que cela signifie mais je ne sais pas quoi faire pour la résoudre.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, samedi 9 avril 2016, 22:39
 

Le compilateur vous dit qu'à un endroit où il s'attend à avoir une Stack<Room>, vous lui donnez une Room ; donc, soit vous lui donnez une Stack<Room> comme il le demande, soit vous modifiez votre instruction pour qu'elle n'utilise pas comme une Stack<Room> la Room que vous lui donnez.

Je ne peux hélas pas vous aider plus, puisque vous n'avez pas copié/collé la ligne qui provoque cette erreur !

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mardi 27 mars 2018, 18:36
 

Un étudiant a écrit :

Après avoir fais marcher ma commande Retour. Je vois qu’il faut la changer en remplacer mon aRetourRoom par une instruction qui utilise une pile de aRetourRooms. 
En relisant 4/5 fois la consigne et en regarder le forum disponible juste en dessous,  je n’ai toujours pas compris le but de l’exercice.
A quoi cela aller nous servir alors que notre fonction pour retourner dans la pièce précédente marchait.

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mardi 27 mars 2018, 18:42
 

Vous dites "A quoi cela aller nous servir alors que notre fonction pour retourner dans la pièce précédente marchait",
mais avez-vous bien fait l'exercice 7.25 ?
Le programme fait-il bien ce qu'on attend de lui quand on veut revenir plusieurs fois en arrière ?

C'est pour cela que mémoriser une pièce ne suffit pas : il faut mémoriser tout le chemin parcouru pour pouvoir le refaire en sens inverse ...

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 16 décembre 2018, 16:52
 

Un étudiant a écrit :

     J'ai bien fait toutes les modifications pour la pile et ca a bien compilé mais quand je lance le jeu il me met NullPointerException à la ligne : 
     aPreviousRooms.push(vHall); (dans createRoom() de GameEngine). 
Pourtant dans le constructeur de GameEngine j'ai bien initialisé aPreviousRoom par :
     aPreviousRooms = new Stack<Room>();
Du coup je ne comprends pas trop le problème, à moins qu'une pile vide est null ? Mais dans ce cas je ne vois pas trop comment faire.


Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, dimanche 16 décembre 2018, 17:05
 

Tout d'abord, votre dernière question :

Une pile vide est quand-même une pile !
Donc l'objet Stack existe et la référence ne vaut pas null.

Maintenant, pourquoi vaut-elle null dans votre cas ?

Vous avez bien commencé votre raisonnement, il faut juste le poursuivre :

- aPreviousRooms vaut null lors du push
- aPreviousRooms est initialisé dans le constructeur
- donc le push a lieu avant l'initialisation dans le constructeur

Voyez-vous comment corriger ?  ;-)

Une dernière remarque : je ne suis pas sûr qu'un push soit nécessaire dans createRooms. C'est plutôt quand on quitte une pièce que l'on empile la pièce que l'on vient de quitter ...

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, jeudi 11 avril 2019, 09:11
 

Un étudiant a écrit :

Lorsque que je le compile, tout se passe bien.
Mais quand j'execute et que je tape une commande pour aller dans une direction, il me dit que j'ai pas traité une exception (voir ci dessous).
Alors je suppose que c'est à propos quand mon Stack est null et que je tente de faire un pop() mais est ce que je dois faire try,catch,throws pour traiter l'exception (alors que dans la javadoc, la méthode pop() possédait déjà un throws) ou est-ce autre chose?

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, jeudi 11 avril 2019, 09:15
 

1) "il me dit que j'ai pas traité une exception (voir ci dessous)"
Ce n'est pas ce que je vois : vous obtenez simplement une NullPointerException.

2) Cela n'a donc rien à voir avec la méthode pop qui peut effectivement lancer une exception en cas de pile vide (EmptyStackException).

3) Vous ne me donnez hélas pas la ligne 197 où survient la NullPointerException, mais je peux deviner qu'elle comporte un appel de la forme this.aPreviousRooms.methode().
Cela nous indique donc que this.aPreviousRooms vaut null.
Pouvez-vous montrer dans votre code une instruction qui fait en sorte que cet attribut ne soit pas nul ?
Si non, vous savez quoi corriger.
Si oui, c'est que votre programme ne passe pas par cette instruction ! (à vous de chercher pourquoi)

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mardi 12 décembre 2023, 09:09
 

Un étudiant a écrit :

Faut-il traiter le cas où on tape "back back back" pour revenir 3 fois en arrière ?

Avatar Denis BUREAU
Re: Exercice 7.26
par Denis BUREAU, mardi 12 décembre 2023, 09:19
 

Non. On pourrait aussi vouloir revenir 5 fois en arrière ;-) et la commande back n'accepte pas de second mot, encore moins de 3ème !
Pour revenir 3 fois en arrière, il suffit de taper 3 fois successivement la commande back.